home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / programming / gamesmaster / source / asm / demos / pobs.s < prev    next >
Encoding:
Text File  |  1996-09-08  |  10.2 KB  |  419 lines

  1. ;POBS DEMO
  2. ;---------
  3. ;This demo originally came from the HowToCode series.
  4. ;That version was converted to GMS by Paul.
  5. ;
  6. ;This demo took just 15 minutes in being converted to a multi-tasking demo,
  7. ;without any speed loss in run-time.
  8.  
  9.     opt    o+
  10.  
  11.     INCLUDE    "exec/exec_lib.i"
  12.     INCLUDE    "games/games_lib.i"
  13.     INCLUDE    "games/games.i
  14.  
  15. CALL    MACRO
  16.     jsr    _LVO\1(a6)
  17.     ENDM
  18.  
  19. width    EQU    40
  20. height    EQU    256
  21.  
  22.     SECTION    "Pobs",CODE
  23.  
  24. ;==========================================================================;
  25. ;                             INITIALISE DEMO
  26. ;==========================================================================;
  27.  
  28. Start:    MOVEM.L    A0-A6/D1-D7,-(SP)
  29.     move.l    ($4).w,a6
  30.     lea    GMS_Name(pc),a1
  31.     moveq    #$00,d0
  32.     CALL    OpenLibrary
  33.     move.l    d0,GMS_Base
  34.     beq    Quit
  35.  
  36.     move.l    GMS_Base(pc),a6
  37.     CALL    SetUserPri
  38.  
  39.     move.l    GMS_Base(pc),a6          ;Tell GMS that we want to add a
  40.     lea    ScreenStruct(pc),a0      ;screen for use.
  41.     CALL    Add_Screen
  42.     tst.l    d0
  43.     bne.s    Error
  44.  
  45.     lea    ScreenStruct(pc),a0      ;Now show the screen/pic.
  46.     CALL    Show_Screen
  47.  
  48. ;==========================================================================;
  49. ;                                MAIN LOOP
  50. ;==========================================================================;
  51.  
  52.     bsr.w    InPtabs
  53.     bsr.w    Rmasks
  54.  
  55. .loop    move.l    GMS_Base(pc),a6
  56.     CALL    Wait_OSVBL
  57.     lea    ScreenStruct(pc),a0
  58.     CALL    SwapBuffers
  59.  
  60.     move.l    Clear(pc),$dff054
  61.     move.l    #$01000000,$dff040
  62.     move.w    #0,$dff066
  63.     move.w    #(height*64)+(width/2),$dff058
  64.  
  65.     bsr.w    Calc
  66.     bsr.w    Put
  67.  
  68.     cmp.w    #293-1,number
  69.     beq.b    .mouse
  70.     addq.w    #1,number
  71.  
  72. .mouse    move.l    GMS_Base(pc),a6
  73.     moveq    #JPORT1,d0
  74.     CALL    Read_Mouse
  75.     btst    #MB_LMB,d0
  76.     beq.s    .loop
  77.  
  78. ;===========================================================================;
  79. ;                              RETURN TO DOS
  80. ;===========================================================================;
  81.  
  82. ReturnToDOS:
  83.     move.l    GMS_Base(pc),a6
  84.     lea    ScreenStruct(pc),a0
  85.     CALL    Delete_Screen            ;Give back screen memory etc.
  86. Error    move.l    GMS_Base(pc),a1
  87.     move.l    ($4).w,a6
  88.     CALL    CloseLibrary
  89. Quit    MOVEM.L    (SP)+,A0-A6/D1-D7
  90.     moveq    #$00,d0
  91.     rts
  92.  
  93. ;===========================================================================;
  94. ;                            SET UP POB TABLES
  95. ;===========================================================================;
  96.  
  97. InPtabs    lea    pob_xbuffer,a0    ;a0 = Ptr to XBuffer.
  98.     moveq    #$00,d0    ;d0 = 00.
  99. .xloop    move.w    d0,d1
  100.     and.w    #$000f,d1    ;d1 = $000x
  101.     lsl.w    #6,d1    ;d1 = <<6
  102.     move.w    d1,(a0)+    ;a0 = +d1
  103.     move.w    d0,d1
  104.     and.w    #$fff0,d1    ;d2 = $xxx0
  105.     ror.w    #3,d1    ;d2 = $?xxx
  106.     move.w    d1,(a0)+    ;a0 = +d2
  107.     addq.w    #1,d0    ;d0 = ++1
  108.     cmp.w    #width*8,d0    ;d0 > Is d0 == ScreenWidth?
  109.     bne.b    .xloop
  110.  
  111.     lea    pob_ybuffer,a0
  112.     moveq    #$00,d0
  113. .yloop    move.w    d0,d1
  114.     mulu    #width,d1
  115.     move.l    d1,(a0)+
  116.     addq.w    #1,d0
  117.     cmp.w    #height,d0
  118.     bne.b    .yloop
  119.     rts
  120.  
  121. ;===========================================================================;
  122. ;
  123. ;===========================================================================;
  124.  
  125. Rmasks:    moveq    #0,d7
  126.     lea    shape_buffer,a1
  127. .loop1    lea    pob_shape(pc),a0
  128.     move.w    #16,d6
  129. .loop2    move.l    (a0)+,d0
  130.     ror.l    d7,d0
  131.     move.l    d0,(a1)+
  132.     subq.w    #1,d6
  133.     bne.b    .loop2
  134.     addq.w    #1,d7
  135.     cmpi.w    #16,d7
  136.     bne.b    .loop1
  137.     rts
  138.  
  139. ;===========================================================================;
  140. ;                       ADJUST POB SCREEN POSITIONS
  141. ;===========================================================================;
  142.  
  143. Calc:    move.w    #$eeee,d0
  144.     move.w    #720,d6
  145.     lea    sinx_pointer1(pc),a0
  146.  
  147.     movem.l    (a0),a2/a3/a4/a5
  148.     movem.w    sinx_add1(pc),d2/d3/d4/d5
  149.  
  150.     adda.w    d2,a2
  151.     cmp.w    (a2),d0
  152.     bne.b    .bkip1
  153.     suba.w    d6,a2
  154.  
  155. .bkip1:    adda.w    d3,a3
  156.     cmp.w    (a3),d0
  157.     bne.b    .bkip2
  158.     suba.w    d6,a3
  159.  
  160. .bkip2:    adda.w    d4,a4
  161.     cmp.w    (a4),d0
  162.     bne.b    .bkip3
  163.     suba.w    d6,a4
  164.  
  165. .bkip3:    adda.w    d5,a5
  166.     cmp.w    (a5),d0
  167.     bne.b    .bkip4
  168.     suba.w    d6,a5
  169.  
  170. .bkip4:    movem.l    a2/a3/a4/a5,(a0)
  171.     lea    coord_stack,a0
  172.     movem.w    sinx_dist1(pc),d3-d4/a1/a6
  173.     move.w    d0,d5
  174.     move.w    number(pc),d7            ;d7 = Number of Pobs.
  175. .loop    add.w    d3,a2
  176.     add.w    d4,a3
  177.     cmp.w    (a2),d5
  178.     bne.b    .not_x1
  179.     suba.w    d6,a2
  180. .not_x1    cmp.w    (a3),d5
  181.     bne.b    .not_x2
  182.     suba.w    d6,a3
  183. .not_x2    move.w    (a2),d0
  184.     add.w    (a3),d0
  185.     add.w    a1,a4
  186.     add.w    a6,a5
  187.     cmp.w    (a4),d5
  188.     bne.b    .not_y1
  189.     suba.w    d6,a4
  190. .not_y1    cmp.w    (a5),d5
  191.     bne.b    .not_y2
  192.     suba.w    d6,a5
  193. .not_y2    move.w    (a4),d1
  194.     add.w    (a5),d1
  195.     move.w    d0,(a0)+
  196.     move.w    d1,(a0)+
  197.     dbf    d7,.loop
  198.     rts
  199.  
  200. ;===========================================================================;
  201. ;                          PLACE POBS ON SCREEN
  202. ;===========================================================================;
  203.  
  204. Put:    lea    pob_xbuffer,a0
  205.     lea    pob_ybuffer,a1
  206.     lea    shape_buffer,a4
  207.     move.l    Active(pc),a6
  208.     lea    coord_stack,a5
  209.  
  210.     move.w    number(pc),d7
  211. .loop    movem.w    (a5)+,d0/d1    ;d0 = X, d1 = Y
  212.     lsl.w    #2,d0    ;d0 = (XCoord)*4 [long]
  213.     lsl.w    #2,d1    ;d0 = (YCoord)*4 [long]
  214.     move.l    (a0,d0.w),d0
  215.     lea    width(a6,d0.w),a3
  216.     add.l    (a1,d1.w),a3
  217.     swap    d0
  218.     lea    (a4,d0.w),a2
  219.     movem.l    (a2),d0-d5    ;d0..d5 = POB Gfx Data. 
  220.     or.l    d0,(a3)
  221.     or.l    d1,width(a3)
  222.     or.l    d2,width*2(a3)
  223.     or.l    d3,width*3(a3)
  224.     or.l    d4,width*4(a3)
  225.     or.l    d5,width*5(a3)
  226.     dbf    d7,.loop
  227.     rts
  228.  
  229. ;===========================================================================;
  230. ;
  231. ;===========================================================================;
  232.  
  233. sinx_pointer1:    dc.l    sin_xtab
  234. sinx_pointer2:    dc.l    sin_xtab
  235. siny_pointer1:    dc.l    sin_ytab
  236. siny_pointer2:    dc.l    sin_ytab
  237. sinx_add1:    dc.w    1*2    ;change values here to obtain
  238. sinx_add2:    dc.w    5*2    ;new patterns
  239. siny_add1:    dc.w    3*2
  240. siny_add2:    dc.w    2*2
  241. sinx_dist1:    dc.w    4*2
  242. sinx_dist2:    dc.w    3*2
  243. siny_dist1:    dc.w    1*2
  244. siny_dist2:    dc.w    2*2
  245. number:    dc.w    0    ;number of 'pobs'
  246.  
  247. sin_xtab:
  248.     dc.w    75,76,78,79,80,82,83,84
  249.     dc.w    85,87,88,89,91,92,93,94
  250.     dc.w    96,97,98,99,101,102,103,104
  251.     dc.w    106,107,108,109,110,111,112,114
  252.     dc.w    115,116,117,118,119,120,121,122
  253.     dc.w    123,124,125,126,127,128,129,130
  254.     dc.w    131,132,132,133,134,135,136,136
  255.     dc.w    137,138,139,139,140,141,141,142
  256.     dc.w    142,143,144,144,145,145,145,146
  257.     dc.w    146,147,147,147,148,148,148,149
  258.     dc.w    149,149,149,149,150,150,150,150
  259.     dc.w    150,150,150,150,150,150,150,150
  260.     dc.w    150,149,149,149,149,149,148,148
  261.     dc.w    148,147,147,147,146,146,145,145
  262.     dc.w    145,144,144,143,142,142,141,141
  263.     dc.w    140,139,139,138,137,136,136,135
  264.     dc.w    134,133,132,132,131,130,129,128
  265.     dc.w    127,126,125,124,123,122,121,120
  266.     dc.w    119,118,117,116,115,114,113,111
  267.     dc.w    110,109,108,107,106,104,103,102
  268.     dc.w    101,99,98,97,96,94,93,92
  269.     dc.w    91,89,88,87,85,84,83,82
  270.     dc.w    80,79,78,76,75,74,72,71
  271.     dc.w    70,68,67,66,65,63,62,61
  272.     dc.w    59,58,57,56,54,53,52,51
  273.     dc.w    49,48,47,46,44,43,42,41
  274.     dc.w    40,39,38,36,35,34,33,32
  275.     dc.w    31,30,29,28,27,26,25,24
  276.     dc.w    23,22,21,20,19,18,18,17
  277.     dc.w    16,15,14,14,13,12,11,11
  278.     dc.w    10,9,9,8,8,7,6,6
  279.     dc.w    5,5,5,4,4,3,3,3
  280.     dc.w    2,2,2,1,1,1,1,1
  281.     dc.w    0,0,0,0,0,0,0,0
  282.     dc.w    0,0,0,0,0,1,1,1
  283.     dc.w    1,1,2,2,2,3,3,3
  284.     dc.w    4,4,5,5,5,6,6,7
  285.     dc.w    8,8,9,9,10,11,11,12
  286.     dc.w    13,14,14,15,16,17,18,18
  287.     dc.w    19,20,21,22,23,24,25,26
  288.     dc.w    27,28,29,30,31,32,33,34
  289.     dc.w    35,36,37,39,40,41,42,43
  290.     dc.w    44,46,47,48,49,51,52,53
  291.     dc.w    54,56,57,58,59,61,62,63
  292.     dc.w    65,66,67,68,70,71,72,74
  293.     dc.w    75
  294.     dc.w    $eeee,$eeee,$eeee,$eeee
  295.     dc.w    $eeee,$eeee,$eeee,$eeee
  296.     dc.w    $eeee,$eeee,$eeee,$eeee
  297.     dc.w    $eeee,$eeee,$eeee,$eeee
  298.     dc.w    $eeee,$eeee,$eeee,$eeee
  299.     dc.w    $eeee,$eeee,$eeee,$eeee
  300.     dc.w    $eeee,$eeee,$eeee,$eeee
  301.     dc.w    $eeee,$eeee,$eeee,$eeee
  302.     dc.w    $eeee,$eeee,$eeee,$eeee
  303.     dc.w    $eeee,$eeee,$eeee,$eeee
  304.  
  305. sin_ytab:
  306.     dc.w    57,59,60,61,62,63,64,65
  307.     dc.w    66,66,67,68,69,70,71,72
  308.     dc.w    73,74,75,76,77,78,79,80
  309.     dc.w    81,82,83,84,84,85,86,87
  310.     dc.w    88,89,90,90,91,92,93,94
  311.     dc.w    94,95,96,97,97,98,99,100
  312.     dc.w    100,101,102,102,103,103,104,105
  313.     dc.w    105,106,106,107,107,108,108,109
  314.     dc.w    109,110,110,110,111,111,112,112
  315.     dc.w    112,112,113,113,113,114,114,114
  316.     dc.w    114,114,114,115,115,115,115,115
  317.     dc.w    115,115,115,115,115,115,115,115
  318.     dc.w    115,115,114,114,114,114,114,114
  319.     dc.w    113,113,113,112,112,112,112,111
  320.     dc.w    111,110,110,110,109,109,108,108
  321.     dc.w    107,107,106,106,105,105,104,103
  322.     dc.w    103,102,102,101,100,100,99,98
  323.     dc.w    97,97,96,95,94,94,93,92
  324.     dc.w    91,90,90,89,88,87,86,85
  325.     dc.w    84,84,83,82,81,80,79,78
  326.     dc.w    77,76,75,74,73,72,71,70
  327.     dc.w    69,68,67,66,66,65,64,63
  328.     dc.w    62,61,60,59,58,56,55,54
  329.     dc.w    53,52,51,50,49,49,48,47
  330.     dc.w    46,45,44,43,42,41,40,39
  331.     dc.w    38,37,36,35,34,33,32,31
  332.     dc.w    31,30,29,28,27,26,25,25
  333.     dc.w    24,23,22,21,21,20,19,18
  334.     dc.w    18,17,16,15,15,14,13,13
  335.     dc.w    12,12,11,10,10,9,9,8
  336.     dc.w    8,7,7,6,6,5,5,5
  337.     dc.w    4,4,3,3,3,3,2,2
  338.     dc.w    2,1,1,1,1,1,1,0
  339.     dc.w    0,0,0,0,0,0,0,0
  340.     dc.w    0,0,0,0,0,0,1,1
  341.     dc.w    1,1,1,1,2,2,2,3
  342.     dc.w    3,3,3,4,4,5,5,5
  343.     dc.w    6,6,7,7,8,8,9,9
  344.     dc.w    10,10,11,12,12,13,13,14
  345.     dc.w    15,15,16,17,18,18,19,20
  346.     dc.w    21,21,22,23,24,25,25,26
  347.     dc.w    27,28,29,30,31,31,32,33
  348.     dc.w    34,35,36,37,38,39,40,41
  349.     dc.w    42,43,44,45,46,47,48,49
  350.     dc.w    49,50,51,52,53,54,55,56
  351.     dc.w    57
  352.     dc.w    $eeee,$eeee,$eeee,$eeee
  353.     dc.w    $eeee,$eeee,$eeee,$eeee
  354.     dc.w    $eeee,$eeee,$eeee,$eeee
  355.     dc.w    $eeee,$eeee,$eeee,$eeee
  356.     dc.w    $eeee,$eeee,$eeee,$eeee
  357.     dc.w    $eeee,$eeee,$eeee,$eeee
  358.     dc.w    $eeee,$eeee,$eeee,$eeee
  359.     dc.w    $eeee,$eeee,$eeee,$eeee
  360.     dc.w    $eeee,$eeee,$eeee,$eeee
  361.     dc.w    $eeee,$eeee,$eeee,$eeee
  362.  
  363. pob_shape:
  364.     dc.w    %0000000110000000,0
  365.     dc.w    %0000000110000000,0
  366.     dc.w    %0000011111100000,0
  367.     dc.w    %0000011111100000,0
  368.     dc.w    %0000000110000000,0
  369.     dc.w    %0000000110000000,0
  370.  
  371. ;===========================================================================;
  372. ;                                  DATA
  373. ;===========================================================================;
  374.  
  375. GMS_Name:
  376.     dc.b    "games.library",0
  377.     even
  378. GMS_Base:
  379.     dc.l    0
  380.  
  381. AMT_PLANES =    1
  382.  
  383. ScreenStruct:
  384.     dc.l    "GSV1",0
  385. Visual    dc.l    Screen                   ;Screen_Mem1
  386. Active    dc.l    Screen+height*width      ;Screen_Mem2
  387. Clear    dc.l    Screen+height*width*2    ;Screen_Mem3
  388.     dc.l    0                        ;Screen link.
  389.     dc.l    ScreenPalette            ;Address of screen palette.
  390.     dc.l    0                        ;Address of rasterlist.
  391.     dc.l    0                        ;Amt of colours in palette.
  392.     dc.w    320,256,320,256          ;Screen & Pic Height/Width.
  393.     dc.w    AMT_PLANES               ;Amt_Planes
  394.     dc.w    0,0                      ;Top Of Screen, X/Y
  395.     dc.w    0,0                      ;X/Y counters (for scrolling).
  396.     dc.l    TPLBUFFER                ;Special attributes.
  397.     dc.w    LORES                    ;Screen mode.
  398.     dc.b    PLANAR                   ;Screen type
  399.     dc.b    0                        ;Reserved.
  400.     even
  401.  
  402. ScreenPalette:
  403.     dc.w    $0000,$0ff0
  404.  
  405.  
  406.     SECTION    Screens,BSS_C
  407.  
  408. Screen:    ds.b    (height*width*3)+(width*50)
  409.  
  410. shape_buffer:
  411.     ds.l    256
  412. pob_xbuffer:
  413.     ds.l    (width*8)
  414. pob_ybuffer:
  415.     ds.l    height
  416.  
  417. coord_stack:
  418.     ds.l    1500
  419.